#ifndef _sdl_input_h_
#define _sdl_input_h_

#include "SDL.h"
#include "sdl_layer.h"
#include "sdl_engine.h"
#include "sdl_singleton.h"
#include "sdl_canvas.h"

/**
 * \brief klasa do obsługi urządzeń wprowadzających
 *
 * Tutaj używamy zmiennych odkrytych, z których można czytać stan urządzeń typu klawiatura i mysz. Zmienne dotyczące myszy same się tłumaczą. Stan klawiatury przechowywany jest w zmiennej Uint8 * keyboard. Jest to macierz o elementach 0 lub 1, do której elementów odwołujemy się stałymi z typu enum SDLKey, którego elementy udokumentowane są w dokumentacji SDL. Do obsługi klawiatury polecane jest używanie klasy sdl_binding, ponieważ używa ona tekstowych nazw klawiszy i pozwala na mapowanie klawiszy.
 * Na ten moment sdl_input dziedziczy od sdl_layer, ale nie jest wetknięty w pętlę główną, ponieważ nie mamy na razie mechanizmu komunikacji między zadaniami oraz zadaniami a pętlą główną. Dopóki nie zaimplementujemy mechanizmu sygnałów, nie jesteśmy w stanie wysłać do pętli sygnału zamknięcia.
 *
 * \todo zintegrować to z bindingiem
 *
 */

struct sdl_input : public sdl_layer, public sdl_singleton<sdl_input> {
    ///pozycja kursora myszy w oknie (x)
    int mouse_x;
    ///względne przesunięcie od ostatniej ramki (x)
    int mouse_rx;
    ///pozycja kursora myszy w oknie (y)
    int mouse_y;
    ///względne przesunięcie od ostatniej ramki (y)
    int mouse_ry;
    ///względne przesunięcie myszy w jednostkach absolutnych (x) (1.0=połowa ekranu*czułość)
    float m_x;
    ///względne przesunięcie myszy w jednostkach absolutnych (y) (1.0=połowa ekranu*czułość);
    float m_y;
    ///czułość myszy w x
    float xsen;
    ///czułość myszy w y
    float ysen;
    ///true jeżeli lewy przycisk myszy wciśnięty
    bool lmb;
    ///true jeżeli prawy przycisk myszy wciśnięty
    bool rmb;
    ///true jeżeli środkowy przycisk myszy wciśnięty
    bool mmb;
    ///macierz klawiatury
    Uint8 * keyboard;

    sdl_input();
    ///uaktualnia stan urządzeń wejścia
    virtual void update();

private:
    ///przetwarzamy zdarzenia i wyrzucamy false, jeżeli dostaliśmy żądanie zamknięcia aplikacji
    bool process_sdl_events();
};

#endif //_sdl_input_h_

